/**
 * 通用datagrid service模块，提供对datagrid的常用功能支持
 * 
 * @Date: 2015-6-16
 * @author: Jackson wang
 * @version: 1.0
 * @since: 1.0
 */
define(["jquery","msgServ","elServ","ajaxServ","datagridServ"], function($,msgServ,elServ,ajaxServ,datagridServ) {

			'use strict';
	
			
			var public_method = {
			
			/**
			 * 展开树的所有节点
			 * @param _options.grid	目标grid对象
			 */
			expandAllNode:function(_options){
				if(_options.grid){
					var rootNodes = $(_options.grid).treegrid('getRoots');
					if((rootNodes!=null)&&(rootNodes.length>0)){
						$(_options.grid).treegrid('expandAll',rootNodes.id);
					}
				}
			},
			
			
			/**
			 * 获取目标datagrid选中的行id
			 * @param _options.target 目标datagrid对象
			 * @param _options.id id字段名称，默认值为'id'
			 * @return String  "," 分隔的选中行id字符串
			 */
			getCheckedIds:function(_options){
				
				return datagridServ.getCheckedIds(_options);
				
			},
			/**
			 * 保存form对象的数据并刷新grid
			 * @argument flag
			 * 			  按钮禁用标志
			 * @param _options.grid
			 *            目标列表对象				 
			 * @param _options.form          
			 *            目标form对象
			 * @param _options.url
			 * 			  保存url   
			 * @param _options.callback
			 * 			  回调函数           
			 * @param _options.evt
			 * 				按钮事件
			 * @return 更新成功返回1，失败返回空值
			 */
			save:function(_options,e){
				var _callback
				if(_options.callback){
					_callback = _options.callback;					
				}
				_options.callback = public_method.updateRow
				datagridServ.save(_options,e);
			},

			/**
			 * 根据表单名称获取表单字段值，并生成json对象返回
			 * 
			 * @param _options.target
			 *            datagrid对象
			 * @param _options.data
			 *            待添加的数据行
			 * @param _options.container
			 *            目标datagrid对象的上级容器
			 * @return 表单json对象
			 * 
			 */
			addRow : function(_options) {
				// 判断目标对象参数类型，获取目标对象
				var retVal;
				var _data = getData(_options);
				var _target = getTarget(_options);
				// 判断目标对象是否为空
				if (_data != null && _target != null) {
					// 判断待添加数据是否为空
					$(_target).datagrid('appendRow', _options.data);
					retVal = 1;
				}
				return retVal;
			},

			/**
			 * 在datagrid对象指定行之前添加一条数据
			 * 
			 * @param options.datagrid
			 *            目标对象
			 * @param options.data
			 *            待添加的数据对象
			 * @param options.index
			 *            参照行序号
			 * @return 添加成功返回1，添加失败返回0，数据对象为空返回-1，目标对象为空返回-2
			 */
			insertRowBefore : function(_options) {
				var retVal;
				var _data = getData(_options);
				var _target = getTarget(_options);
				// 判断目标对象是否为空
				if (_data != null && _target != null) {

					var _rowIndex = _options.index != null
							? _options.index
							: $(_target).datagrid('getRowIndex',
									$(_target).datagrid('getSelected'));

					// 判断待添加数据是否为空
					if (_rowIndex > 0) {
						$(_target).datagrid('insertRow', {
									index : _rowIndex,
									data : _data
								});
						retVal = 1;
					}
				}
				return retVal;
			},

			/**
			 * 在datagrid对象指定行之后添加一条数据
			 * 
			 * @param options.datagrid
			 *            目标对象
			 * @param options.data
			 *            待添加的数据对象
			 * @param options.index
			 *            参照行序号
			 * @return 添加成功返回1，添加失败返回0，数据对象为空返回-1，目标对象为空返回-2
			 */
			insertRowAfter : function() {
				var retVal;
				var _data = getData(_options);
				var _target = getTarget(_options);
				// 判断目标对象是否为空
				if (_data != null && _target != null) {

					var _rowIndex = _options.index != null
							? _options.index
							: $(_target).datagrid('getRowIndex',
									$(_target).datagrid('getSelected'));

					// 判断待添加数据是否为空
					if (_rowIndex > 0) {
						$(_target).datagrid('insertRow', {
									index : _rowIndex + 1,
									data : _data
								});
						retVal = 1;
					}
				}
				return retVal;
			},

			/**
			 * 更新datagrid对象指定行的数据
			 * 
			 * @param options.grid
			 *            目标对象
			 * @param options.data
			 *            待添加的数据对象			 
			 */
			updateRow : function(_options) {				
				
				// 判断目标对象是否为空
				if (_options.data != null && _options.grid != null) {

					var _row =  $(_options.grid).treegrid('find',_options.data.id);

					// 判断待添加数据是否为空
					if (_row) {
						$(_options.grid).treegrid('update', {
							id : _options.data.id,
							row : _options.data
						})
						msgServ.Msgslide('操作成功！');
					}else{
						public_method.insertRow(_options)
					}
				}				
			},
			
			insertRow:function(_options){
				// 判断目标对象是否为空
				if (_options.data != null && _options.grid != null) {
					//判断父节点是否为空
					var _parentid = _options.data.parentid
					var appendToParent = true;
					var _row 
					
					if((_parentid==null)||(_parentid<0)){
						//父节点编码为空
						appendToParent = false;						
					}else{
						_row =  $(_options.grid).treegrid('find',_parentid);
						if(_row==null){
							//父节点未存在treegrid中
							appendToParent = false;	
						}
					}
					
					if(appendToParent){
						$(_options.grid).treegrid('append',{
							parent: _parentid,  // the node has a 'id' value that defined through 'idField' property
							data:[ _options.data]
						});
					}else{
						$(_options.grid).treegrid('append',{								
							data: [_options.data]
						});
					}
					msgServ.Msgslide('插入记录操作成功！');	
				}else{
					msgServ.Msgslide('插入记录为空，操作失败！');
				}
			},
			/**
			 * 删除列表中的选定行
			 * 
			 * @param _options.grid
			 *            表单名称
			 * @param _options.url
			 * 			  删除操作url
			 * @param _options.container
			 *            表单父级容器
			 * @param _options.data
			 * 			  删除的json格式数据
			 * @param options.index
			 *            目标行序号
			 * @return 删除成功返回1，失败返回空值
			 */
			delRow : function(_options) {
				

				var _target = _options.grid;

				// 判断目标对象是否为空
				if (_target != null) {					
					//判断是否选中行
					var selectedRecord = $(_target).treegrid('getSelected');
		
					if(selectedRecord){
						$.messager.confirm('警告', '确定执行删除操作?', function(r){
						
							if( r){	
								var tid = selectedRecord.id;
								ajaxServ.runAjax({
									url:_options.url,
								 	contentType:'form',
								 	data:{id:selectedRecord.id},
								 	callback:function(){						 		
										$(_target).treegrid('remove', selectedRecord.id);
										if(_options.evt && _options.evt.currentTarget){
											$(_options.evt.currentTarget).linkbutton('enable');
										}
										msgServ.Msgslide('删除记录操作成功！');								
								 	}
								})
							}
						})
					}else{
						msgServ.Msgslide('请选择要删除的记录');
						if(_options.evt && _options.evt.currentTarget){
							$(_options.evt.currentTarget).linkbutton('enable');
						}
					}
					// 判断待添加数据是否为空					
				}else{
					if(_options.evt && _options.evt.currentTarget){
						$(_options.evt.currentTarget).linkbutton('enable');
					}
				}
				
				
			},
			/**
				 * 更新datagrid对象指定行的数据
				 * @param options.flag
				 * 			  按钮禁用标志
				 * @param options.grid
				 *            目标列表对象				 
				 * @param options.window          
				 *            目标窗口对象
				 * @param options.data
				 *            待添加的数据对象
				 * @param options.btn
				 * 			  目标命令按钮          
				 * @param options.nullField
				 * 			  需要处理null值的字段
				 * @param options.nullFields
				 * 			  需要处理null值的多个字段 
				 * @return 更新成功返回1，失败返回空值
				 */
				edit:function(_options){
					var _grid = _options.grid,
						_window = _options.window,
						_btn = _options.btn,
						_data = _options.data,
						_flag = _options.flag,
						_singleNullField = _options.nullField,
						_multiNullFields = _options.nullFields;
					//按钮状态控制
					if (_flag == true) {
						$(_btn).linkbutton('enable');
					} else {
						$(_btn).linkbutton('disable');
					}
	
					var selectedRecord = $(_grid).treegrid('getSelected');

					selectedRecord = selectedRecord == null
							? _data
							: selectedRecord;

					if (selectedRecord) {
						//处理字段null值
						if(_singleNullField!=null){
							var fieldName = $.trim(_singleNullField);
							
							var fieldValue = selectedRecord[fieldName];
							if(fieldValue==null){
								selectedRecord[fieldName] = '';							
							}else{
								if(( fieldValue instanceof String)&&($.trim(fieldValue)=='null')){								
									selectedRecord[fieldName] = '';
								}	
							}
						}
						var _form = $(_window).find('form')
						$(_form).form('clear');
						$(_form).form('load', selectedRecord);
						$(_window).window('open')
					} else {
						msgServ.Msgslide('请选择要操作的记录');
					}
				}		
			}			
			return public_method
		});